//
// Created by mio on 25-4-17.
//

#ifndef RTMPHANDSHAKE_H
#define RTMPHANDSHAKE_H

#include "../Net/BufferReader.h"

/**
 * @brief RtmpHandshake 类，负责处理 RTMP 协议的握手阶段。
 *
 * RTMP 握手是一个三步过程（C0/C1 -> S0/S1/S2 -> C2），用于版本协商和建立连接。
 * 这个类通过一个状态机来管理握手过程。
 */
class RtmpHandshake {
public:
    enum State
    {
        HANDSHAKE_C0C1,
        HANDSHAKE_S0S1S2,
        HANDSHAKE_C2,
        HANDSHAKE_COMPLETE
    };

    RtmpHandshake(State state);
    virtual ~RtmpHandshake();

    /**
     * @brief 解析传入的数据流，推进握手状态，并准备相应的响应数据。
     * @param in_buffer 包含从对端接收到的数据的 BufferReader 对象。
     * @param res_buf 用于存放此步骤需要发送回对端的响应数据的缓冲区。
     * @param res_buf_size res_buf 的大小（字节）。
     * @return int 需要发送的响应数据的字节数。
     *         返回 0 表示当前数据不足以完成当前步骤，需要更多数据。
     *         返回 >0 表示成功处理了当前步骤并生成了响应，值为响应数据的字节数。
     *         返回 -1 表示发生协议错误（如版本号不对）。
     */
    int Parse(BufferReader& in_buffer, char* res_buf, uint32_t res_buf_size);

    /**
     * @brief 检查握手是否已经完成。
     * @return true 如果握手状态为 HANDSHAKE_COMPLETE。
     */
    bool IsCompleted() const { return handshake_state_ == HANDSHAKE_COMPLETE; }
    /**
     * @brief (客户端使用) 构建初始的 C0 + C1 握手报文。
     * @param buf 用于存放生成的 C0C1 报文的缓冲区。
     * @param buf_size buf 的大小（字节）。
     * @return int 生成的 C0C1 报文的总字节数 (1 + 1536 = 1537)。
     */
    int BuildC0C1(char* buf, uint32_t buf_size);

private:
    State handshake_state_; // 当前握手状态

    // RTMP 握手 C0/S0 长度 (1字节)
    static const uint32_t kHandshakeVersionLength = 1;
    // RTMP 握手 C1/S1/C2 长度 (1536字节)
    static const uint32_t kHandshakePacketLength = 1536;
};



#endif //RTMPHANDSHAKE_H
